home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 September & October / Amiga-CD 1996 #9-10.iso / aminet / 7-96 / alphaspell / interfaces / golded / aspell.ged
Text File  |  1996-05-10  |  18KB  |  563 lines

  1. /**************************************************************************/
  2. /* $VER: ASpell.ged 2.2 (10 May 1996)                                     */
  3. /* The AlphaSpell GUI © Copyright Fergus Duniho 1995-6                    */
  4. /**************************************************************************/
  5.  
  6. OPTIONS RESULTS
  7. OPTIONS FAILAT 20
  8. SIGNAL ON SYNTAX
  9. SIGNAL ON FAILURE
  10. ARG options
  11.  
  12. CALL OpenLib("rexxsupport.library")
  13. CALL OpenLib("rexxtricks.library")
  14. IF REXXTRICKSVERSION() < "38.6" THEN EXIT
  15.  
  16. GUI = "AlphaSpell:ASpell.gui"
  17. PSC = GetScreen()
  18. EditPort = GetEditPort()
  19.  
  20. tempfile = "T:Temp" || TIME(s)
  21. win.title = "Select a Word:"
  22. win.gadgettext = "_Accept|_Cancel"
  23. win.pubscreen = PSC
  24. win.width = 40
  25. win.sort = "FALSE"
  26. win.multiselect = "FALSE"
  27.  
  28. CALL Spellcheck()
  29. 'UNLOCK' /* GOLDED SPECIFIC */
  30. CALL Cleanup()
  31. EXIT
  32.  
  33. /**************************************************************************/
  34. /* SetUp() -- Opens command hosts, etc.                                   */
  35. /**************************************************************************/
  36.  
  37. SpellCheck:
  38.  
  39. /**************************************************************************/
  40. /* Launch AlphaSpell                                                      */
  41. /**************************************************************************/
  42.  
  43. IF Show("P", "ALPHASPELL") ~= 1 THEN DO
  44.     ADDRESS COMMAND "run >NIL: AlphaSpell:AlphaSpell AREXX"
  45.     ADDRESS COMMAND "WaitForPort ALPHASPELL"
  46.     shutdown = 1
  47. END
  48. ELSE shutdown = 0
  49.  
  50. IF SHOW("P", "ALPHASPELL") = 0 THEN RETURN
  51.  
  52. /**************************************************************************/
  53. /* Launch Varexx                                                          */
  54. /**************************************************************************/
  55.  
  56. /* Check Varexx is loaded if not load it */
  57.  
  58. IF SHOW("P","VAREXX") ~= 1 THEN DO
  59.     ADDRESS COMMAND "run >NIL: varexx"
  60.     ADDRESS COMMAND "WaitForPort VAREXX"
  61. END
  62. ADDRESS VAREXX
  63.  
  64. IF OPENPORT("HOLLY") = 0 THEN DO
  65.     ADDRESS ALPHASPELL ANNOUNCE "Could not open Varexx"
  66.     RETURN
  67. END
  68. version
  69. IF RESULT < 1.6 THEN DO
  70.     ADDRESS ALPHASPELL ANNOUNCE "You need version 1.6+ of Varexx"
  71.     RETURN
  72. END
  73. "load" GUI "HOLLY PS" PSC
  74. vhost = RESULT
  75. ADDRESS VALUE vhost
  76.  
  77. IF EditPort ~= "" THEN ADDRESS VALUE EditPort
  78. 'LOCK' /* GOLDED SPECIFIC */
  79. ADDRESS
  80.  
  81. /**************************************************************************/
  82. /* Localize gadget text for chosen language                               */
  83. /**************************************************************************/
  84.  
  85. lang = GetENV("language")
  86. IF lang ~= "" & lang ~= "english" THEN DO
  87.     catalog = "AlphaSpell:Catalogs/ASpell." || lang
  88.     IF Exists(catalog) THEN DO
  89.         CALL READFILE catalog, lines
  90.         DO x = 1 to lines.0
  91.             INTERPRET "setlabel" "'"lines.x"'"
  92.         END
  93.     END
  94. END
  95.  
  96. /**************************************************************************/
  97. /* Show About screen while AlphaSpell checks document.                    */
  98. /**************************************************************************/
  99.  
  100. show about
  101.  
  102. ADDRESS ALPHASPELL WHO
  103. name = RESULT
  104. IF name ~= "" THEN settext share name
  105. CALL ReadPrefs()
  106. IF Pos("CLIP", options) > 0 THEN DO
  107.     CALL READCLIPBOARD "0", "lines"
  108.     CALL WRITEFILE  tempfile, "lines"
  109. END
  110. ELSE CALL SaveTemp()
  111.  
  112. /**************************************************************************/
  113. /* Spell check tempfile with AlphaSpell                                   */
  114. /**************************************************************************/
  115.  
  116. IF Pos("TEX", options) > 0 THEN switches = "TEX"
  117. ELSE switches = ""
  118. ADDRESS ALPHASPELL "CHECK" tempfile tempfile "PATH" dict_path dict_list switches
  119.  
  120. /**************************************************************************/
  121. /* Set Lists                                                              */
  122. /**************************************************************************/
  123.  
  124. CALL ReadList "UNFOUND"
  125. IF UNFOUND.0 = 0 THEN DO
  126.     ADDRESS ALPHASPELL ANNOUNCE "Spell Checking Finished:\n\nNo Misspellings Found\n"
  127.     RETURN
  128. END
  129. current = 1
  130. LWORDS.0 = 0
  131. MWORDS.0 = 0
  132.  
  133. hide
  134. show main
  135. IF name = "" THEN setbar ed max 2
  136. window front activate
  137. CALL SetTarget UNFOUND.1
  138.  
  139. /**************************************************************************/
  140. /* MAIN LOOP -- Check for GUI events                                      */
  141. /**************************************************************************/
  142.  
  143. DO FOREVER
  144.     CALL WAITPKT("HOLLY")
  145.     packet = GETPKT("HOLLY")
  146.     IF packet ~= '00000000'x THEN DO
  147.         class = GETARG(packet)
  148.         SELECT
  149.             WHEN class = "CLOSEWINDOW" THEN LEAVE
  150.             WHEN class = "LEARN" THEN CALL Learn()
  151.             WHEN class = "FIND" THEN flag = FindWord(flag)
  152.             WHEN class = "REPLACE" THEN CALL ReplaceWord()
  153.             WHEN class = "GUESS" THEN CALL Guess()
  154.             WHEN class = "NEXT" THEN CALL SetTarget("+1")
  155.             WHEN class = "PREV" THEN CALL SetTarget("-1")
  156.             WHEN class = "FIRST" THEN CALL SetTarget(1)
  157.             WHEN class = "LAST" THEN CALL SetTarget(UNFOUND.0)
  158.             WHEN class = "SELECT" THEN CALL ChooseWord()
  159.             WHEN Word(class, 1) = "METHOD" THEN DO
  160.                 IF Word(class, 2) = "0" THEN set ed enable
  161.                 ELSE set ed disable
  162.             END
  163.             WHEN class = "PREFS" THEN DO
  164.                 CALL Preferences()
  165.                 CALL SetTarget(current)
  166.                 IF name = "" THEN setbar ed max 2
  167.             END
  168.             OTHERWISE NOP
  169.         END
  170.         window front activate
  171.     END
  172. END
  173. IF LWORDS.0 + MWORDS.0 > 0 THEN DO
  174.     hide
  175.     show learn
  176.     CALL QSORT "LWORDS"
  177.     LWORDS.count = LWORDS.0
  178.     setlist lwords clear stem LWORDS select LWORDS.1
  179.     CALL QSORT "MWORDS"
  180.     MWORDS.count = MWORDS.0
  181.     setlist mwords clear stem MWORDS select MWORDS.1
  182.     DO FOREVER
  183.         CALL WAITPKT("HOLLY")
  184.         packet = GETPKT("HOLLY")
  185.         IF packet ~= '00000000'x THEN DO
  186.             class = GETARG(packet)
  187.             SELECT
  188.                 WHEN class = "CLOSEWINDOW" THEN LEAVE
  189.                 WHEN class = "SAVEWORDS" THEN DO
  190.                     CALL SaveList()
  191.                     LEAVE
  192.                 END
  193.                 WHEN class = "MOVE" THEN CALL Move()
  194.                 WHEN class = "RML" THEN CALL Lose("lwords")
  195.                 WHEN class = "RMM" THEN CALL Lose("mwords")
  196.                 OTHERWISE NOP
  197.             END
  198.             window front activate
  199.         END
  200.     END
  201. END
  202. ADDRESS
  203. RETURN
  204.  
  205. /**************************************************************************/
  206. /* VARIOUS SUBROUTINES                                                    */
  207. /**************************************************************************/
  208.  
  209. /**************************************************************************/
  210. /* SetTarget(word) -- Sets the word in the target string gadget           */
  211. /**************************************************************************/
  212.  
  213. SetTarget:
  214. IF DATATYPE(arg(1)) = "NUM" THEN DO
  215.     IF VERIFY(arg(1), "+-", "M") = 1 THEN current = current + arg(1)
  216.     ELSE current = arg(1)
  217.     IF current < 1 THEN current = UNFOUND.0
  218.     IF current > UNFOUND.0 THEN current = 1
  219.     settext target UNFOUND.current
  220.     settext replacement UNFOUND.current
  221. END
  222. ELSE DO
  223.     settext target arg(1)
  224.     settext replacement arg(1)
  225. END
  226. flag = 0 /* Word hasn't been searched for since selection */
  227. RETURN
  228.  
  229. /**************************************************************************/
  230. /* SetReplace() - Sets replacement string gadget                          */
  231. /**************************************************************************/
  232.  
  233. SetReplace:
  234. settext replacement arg(1)
  235. settext target UNFOUND.current
  236. RETURN
  237.  
  238. /**************************************************************************/
  239. /* Learn() -- Adds a word to LEARN, the words to learn list               */
  240. /**************************************************************************/
  241.  
  242. Learn:
  243. read target
  244. wrd = RESULT
  245. /* Tests whether wrd is lowercase */
  246. IF BITOR(wrd,," ") == wrd THEN DO
  247.     IF LSEARCH(wrd, "LWORDS") == -1 THEN DO
  248.         cnt = LWORDS.0 + 1
  249.         LWORDS.0 = cnt
  250.         LWORDS.cnt = wrd
  251.     END
  252. END
  253. ELSE DO
  254.     cur = LSEARCH(wrd, "MWORDS")
  255.     DO WHILE (MWORDS.cur = wrd) & (MWORDS.cur ~== wrd)
  256.         cur = cur + 1
  257.     END
  258.     IF cur == -1 THEN DO
  259.         cnt = MWORDS.0 + 1
  260.         MWORDS.0 = cnt
  261.         MWORDS.cnt = wrd
  262.     END
  263. END
  264. CALL SetTarget("+1")
  265. RETURN
  266.  
  267. /**************************************************************************/
  268. /* Guess() has AlphaSpell search for anagrams, matches, or guesses        */
  269. /**************************************************************************/
  270.  
  271. Guess:
  272. busy set
  273. read method
  274. mode = RESULT
  275. read replacement
  276. targ = RESULT
  277. SELECT
  278.     WHEN mode = 0 THEN DO
  279.         read ed
  280.         op = "ED" RESULT
  281.     END
  282.     WHEN mode = 2 THEN op = "ANAGRAMS"
  283.     WHEN mode = 3 THEN op = "CASE"
  284.     OTHERWISE op = ""
  285. END
  286.  
  287. ADDRESS ALPHASPELL "MATCH" targ op "TO" tempfile "PATH" dict_path dict_list
  288. CALL ReadList "GUESS"
  289. busy
  290. IF GUESS.0 > 0 THEN DO
  291.     IF VIEWLIST("GUESS", "win", "dest") = 1 THEN CALL SetReplace(dest.1)
  292. END
  293. ELSE ADDRESS ALPHASPELL ANNOUNCE "Search Complete:\n\nNo Match Found\n"
  294. RETURN
  295.  
  296. /**************************************************************************/
  297. /* ChooseWord() -- Select word from listview of unfound words             */
  298. /**************************************************************************/
  299.  
  300. ChooseWord:
  301. IF VIEWLIST("UNFOUND", "win", "dest") = 1 THEN CALL SetTarget(dest.1)
  302. IF dest.1 ~= "" THEN DO
  303.     current = LSEARCH(dest.1, "UNFOUND")
  304.     uwrd = UPPER(dest.1)
  305.     DO WHILE (UPPER(UNFOUND.current) = uwrd) & (UNFOUND.current ~= dest.1)
  306.         current = current + 1
  307.     END
  308. END
  309. RETURN
  310.  
  311. /**************************************************************************/
  312. /* SaveList() -- Saves words in the "LEARN" list to user dictionary       */
  313. /**************************************************************************/
  314.  
  315. SaveList:
  316. udict.low = MAKEPATH(dict_path, user_dict || ".ald")
  317. udict.mix = MAKEPATH(dict_path, user_dict || ".amd")
  318. read lwords LEARN
  319. LEARN.0 = LEARN.count
  320. IF LEARN.0 > 0 THEN DO
  321.     CALL WRITEFILE tempfile, "LEARN"
  322.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.low
  323. END
  324. read mwords LEARN
  325. LEARN.0 = LEARN.count
  326. IF LEARN.0 > 0 THEN DO
  327.     CALL WRITEFILE tempfile, "LEARN"
  328.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.mix
  329. END
  330. CALL DELETE tempfile
  331. RETURN
  332.  
  333. /**************************************************************************/
  334. /* Move() -- Moves word from mixed case listview to lowercase listview    */
  335. /**************************************************************************/
  336.  
  337. Move:
  338. setlist lwords BITOR(Lose("mwords"),," ")
  339. RETURN
  340.  
  341. /**************************************************************************/
  342. /* ReadList -- Reads words from tempfile to a list and sorts the list     */
  343. /**************************************************************************/
  344.  
  345. ReadList:
  346. CALL READFILE tempfile, arg(1)
  347. INTERPRET arg(1) || ".count =" arg(1) || ".0"
  348. CALL QSORT arg(1)
  349. RETURN
  350.  
  351. /**************************************************************************/
  352. /* Lose() -- Deletes a word from a listview                               */
  353. /**************************************************************************/
  354.  
  355. Lose:
  356. INTERPRET "read" arg(1) boo
  357. wrd = RESULT
  358. INTERPRET "setlist" arg(1) "wrd del"
  359. item = boo.select
  360. IF item = boo.count THEN item = item - 1
  361. INTERPRET "setlist" arg(1) "select s update" item
  362. RETURN wrd
  363.  
  364. /**************************************************************************/
  365. /* Preferences() -- Preferences GUI                                       */
  366. /**************************************************************************/
  367.  
  368. Preferences:
  369.  
  370. hide
  371. show prefs
  372. IF ~GetDir("AlphaSpell:Dict/", "#?", "langs", "D", "N") THEN RETURN
  373. CALL QSORT "langs"
  374. langs.count = langs.0
  375. setlist language clear stem langs
  376. IF LSEARCH(lang, langs) = -1 THEN setlist language langs.1
  377. ELSE setlist language select lang
  378. settext dict dict_list
  379. settext udict user_dict
  380. DO FOREVER
  381.     CALL WAITPKT("HOLLY")
  382.     packet = GETPKT("HOLLY")
  383.     IF packet ~= '00000000'x THEN DO
  384.         class = GETARG(packet)
  385.         SELECT
  386.             WHEN class = "CLOSEWINDOW" | class = "CANCEL" THEN LEAVE
  387.             WHEN class = "SAVE" | class = "USE" THEN DO
  388.                 read language
  389.                 lang = RESULT
  390.                 dict_path = "AlphaSpell:Dict/" || lang || "/"
  391.                 read dict
  392.                 dict_list = RESULT
  393.                 read udict
  394.                 user_dict = RESULT
  395.                 IF class = "SAVE" THEN CALL WritePrefs
  396.                 LEAVE
  397.             END
  398.             OTHERWISE NOP
  399.         END
  400.     END
  401. END
  402. hide
  403. show main
  404. RETURN
  405.  
  406. /**************************************************************************/
  407. /* WritePrefs() -- Writes Preferences to Icon                             */
  408. /**************************************************************************/
  409.  
  410. WritePrefs:
  411. CALL SETTOOLTYPEVALUE GUI, "LANG", lang
  412. CALL SETTOOLTYPEVALUE GUI, "DICT", dict_list
  413. CALL SETTOOLTYPEVALUE GUI, "USER", user_dict
  414. RETURN
  415.  
  416. /**************************************************************************/
  417. /* ReadPrefs() -- Read Preferences from ENV:ASpell.prefs or use defaults  */
  418. /**************************************************************************/
  419.  
  420. ReadPrefs:
  421. lang = GETTOOLTYPEVALUE(GUI, "LANG")
  422. dict_path = "AlphaSpell:Dict/" || lang || "/"
  423. dict_list = GETTOOLTYPEVALUE(GUI, "DICT")
  424. user_dict = GETTOOLTYPEVALUE(GUI, "USER")
  425. IF ~Exists(dict_path) THEN DO
  426.     ADDRESS ALPHASPELL ANNOUNCE dict_path "doesn't exist."
  427.     CALL Preferences()
  428.     show about
  429. END
  430. RETURN
  431.  
  432. /**************************************************************************/
  433. /* Cleanup() -- Closes down the GUI                                       */
  434. /**************************************************************************/
  435.  
  436. Cleanup:
  437. IF SHOWLIST("P", "HOLLY") = 1 THEN CALL CLOSEPORT ("HOLLY")
  438. IF SHOWLIST("P", "VAREXX") = 1 THEN ADDRESS "VAREXX" hide unload
  439. IF SHOWLIST("P", "ALPHASPELL") = 1 & shutdown = 1 THEN ADDRESS ALPHASPELL QUIT
  440. RETURN
  441.  
  442. /**************************************************************************/
  443. /* OpenLib(library) -- Checks that library exists and opens it if it does */
  444. /**************************************************************************/
  445.  
  446. OpenLib: PROCEDURE
  447.  
  448. IF EXISTS("libs:" || arg(1)) THEN DO
  449.     IF ~SHOW("L", arg(1)) THEN
  450.         IF ~ADDLIB(arg(1),0,-30,0) THEN EXIT
  451. END
  452. ELSE EXIT
  453. RETURN
  454.  
  455. /**************************************************************************/
  456. /* ERROR MESSAGES                                                         */
  457. /**************************************************************************/
  458.  
  459. failure:
  460. syntax:
  461. SAY "Error" rc  "-- Line" SIGL
  462. SAY errortext(rc)
  463. SAY sourceline(SIGL)
  464. CALL Cleanup()
  465. EXIT
  466.  
  467. /**************************************************************************/
  468. /* Functions to get around the limits of some text editors. You might or  */
  469. /* might not need some of these.                                          */
  470. /**************************************************************************/
  471.  
  472. /**************************************************************************/
  473. /* WordComp(string, word) -- Checks whether a target word can be parsed   */
  474. /* from a given string. This is useful if your text editor lacks a whole  */
  475. /* word search mode. You can search for a word, read the full text of the */
  476. /* found string, and compare them.                                        */
  477. /**************************************************************************/
  478.  
  479. WordComp: PROCEDURE
  480. Parse Arg str, wrd, x
  481. s = Index(str, wrd, x)
  482. IF s = 0 THEN RETURN 0
  483. IF s>1 THEN DO
  484.     c = Substr(str, s-1, 1)
  485.     IF Datatype(c, "A") = 1 | c = "'" THEN RETURN 0
  486. END
  487. s = s + Length(wrd)
  488. IF s > Length(str) THEN RETURN 1
  489. c = Substr(str, s, 1)
  490. IF Datatype(c, "M") = 1 THEN RETURN 0
  491. RETURN 1
  492. END
  493.  
  494. END
  495.  
  496. /**************************************************************************/
  497. /* EDITOR SPECIFIC SUBROUTINES                                            */
  498. /**************************************************************************/
  499.  
  500. /**************************************************************************/
  501. /* FindWord() -- Finds selected word in document                          */
  502. /**************************************************************************/
  503.  
  504. FindWord: PROCEDURE
  505. read target
  506. wrd = RESULT /* Reads find word */
  507. ADDRESS
  508. IF arg(1) = 0 THEN DO
  509.     'FIND STRING' wrd 'FIRST CASE true WORDS true'
  510. END
  511. ELSE DO
  512.     'FIND STRING' wrd 'NEXT CASE true WORDS true'
  513. END
  514. ADDRESS
  515. RETURN 1
  516.  
  517. /**************************************************************************/
  518. /* ReplaceWord() -- Replaces selected word with word in string gadget     */
  519. /**************************************************************************/
  520.  
  521. ReplaceWord:
  522. read target
  523. wrd = RESULT
  524. read replacement
  525. newword = RESULT
  526. ADDRESS
  527. 'REPLACE BY' newword 'STRING' wrd 'NEXT'
  528. ADDRESS
  529. RETURN
  530.  
  531. /**************************************************************************/
  532. /* SaveTemp() -- Saves the current file as a temporary file               */
  533. /**************************************************************************/
  534.  
  535. SaveTemp:
  536. ADDRESS
  537. 'QUERY DOC VAR OLDNAME' /* remember current file name */
  538. 'SAVE NAME' tempfile 'ALL'
  539. 'NAME' oldname          /* Restore original name */
  540. ADDRESS
  541. RETURN
  542.  
  543. /**************************************************************************/
  544. /* GetEditPort() -- Makes sure the right text editor port is open.        */
  545. /**************************************************************************/
  546.  
  547. GetEditPort:
  548. IF Abbrev(Address(), "GOLDED.") = 1 THEN RETURN Address()
  549. IF ~SHOWLIST("P", "GOLDED.1") THEN DO
  550.     CALL rtezrequest "GOLDED.1 unavailable", "_Abort", "Missing Port:"
  551.     EXIT
  552. END
  553. RETURN "GOLDED.1"
  554.  
  555. /**************************************************************************/
  556. /* GetScreen() -- Returns the screen name                                 */
  557. /**************************************************************************/
  558.  
  559. GetScreen: PROCEDURE
  560. 'QUERY SCREEN VAR NAME'
  561. RETURN NAME
  562.  
  563.